package com.neusoft.utils;

import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyUtil {
	/**
	 * log4j日志对象
	 */
	public static Log logRootLogger = LogFactory.getLog("rootLogger");
	
	/**
	 * 判定对象是否为null或空
	 * @param obj
	 * 			被判定的对象
	 * @return 判定结果（true:不为null且不为空；false:为null或空）
	 * 		
	 */
	public static boolean isNotNVLOrEmpty(Object obj) {
		boolean is_re = false;
		if(obj != null && !obj.equals("")) {
			is_re = true;
		}
		return is_re;
	}
	/**
	 * 通过泛型和反射机制获取实例对象
	 * @param clazz
	 * 			class文件
	 * @return 实例对象
	 */
	public static <T> T getInstance(Class<T> clazz) {
		T tClazz = null;
		try {
			tClazz = clazz.newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return tClazz;
	}
	/**
	 * 将字符串转换为integer类型
	 * @param str
	 * 			被转换的字符串
	 * @return	转换之后的值
	 */
	public static Integer coverStr2Integer(String str) {
		Integer val = null;
		try {
			val = Integer.parseInt(str);
		} catch (Exception e) {
			MyUtil.logRootLogger.info("数据类型转换异常："+e.getMessage());
		}
		
		return val;
	}
	/**
	 * 将时间字符串转换为时间对象(如果转换失败，则返回null)
	 * 
	 * @param strDate
	 *            时间字符串
	 * @param pattern
	 *            时间字符串strDate的格式
	 * @return 转换的时间对象
	 */
	public static Date convertString2Date(String strDate, String pattern) {
		// 默认返回值
		Date date = null;
		// Date date = new Date();
		try {
			if (isNotNVLOrEmpty(date)) {
				// 创建一个date的格式化类
				SimpleDateFormat sdf = new SimpleDateFormat(pattern);
				// 将date转换为指定格式的字符串
				date = sdf.parse(strDate);
			}
		} catch (Exception e) {
			// 转换失败，返回默认值
			System.out.println("字符串转换时间对象失败，返回null值");
		}
		// 返回
		return date;
	}

	/**
	 * Date转换为字符串
	 * 
	 * @param date
	 *            被转换的Date类型
	 * @param pattern
	 *            转换的目标字符串的格式
	 * @return 转之后的字符串
	 */
	public static String convertDate2String(Date date, String pattern) {
		// 设定默认格式
		if (pattern == null || pattern.equals("")) {
			pattern = "yyyy-MM-dd";
		}
		String strDate = null;
		if (date != null) {
			// 创建一个date的格式化类

			SimpleDateFormat sdf = new SimpleDateFormat(pattern);
			// 将date转换为指定格式的字符串

			strDate = sdf.format(date);
		}
	
		// 返回
		return strDate;
	}
	/**
	 * 将request中的form表单的值设置给对应的实体bean对象
	 * 
	 * @param req
	 *            request对象
	 * @param clazzB
	 *            被设置的实体bean
	 * @return 实体bean
	 */
	public static <T> T convertRequestParameters2Bean(HttpServletRequest req, Class<T> clazzB) {
		/*
		 * 在使用beanutils时，如果出现不能进行转换的类型，可以通过ConvertUtils.register方法注册一个转换器，
		 * 转换器可以通过实现Converter接口来创建；
		 */
		// 注册beanutils的类型转换，第一次参数是Converter接口的实现类；第二个参数是转换的目标类型
		ConvertUtils.register(new Converter() {
			/*
			 * 第一个参数是转换的类型； 第二个参数是被转换的值
			 */
			@Override
			public <T> T convert(Class<T> type, Object value) {
				// 要转换的目标日期类型的格式
				final String DATE = "yyyy-MM-dd";
				final String DATETIME = "yyyy-MM-dd HH:mm:ss";
				final String TIMESTAMP = "yyyy-MM-dd HH:mm:ss.SSS";
				// 将字符串转换为日期对象
				if (value == null || "".equals(value)) {
					return null;
				}
				// 判断被转换的对象值是不是String类型
				if (value instanceof String) {
					// 获取转换的对象的字符串
					String dateValue = value.toString().trim();
					// 被转换字符串的长度
					int length = dateValue.length();
					// 判断被转换的类型是不是时间类型
					if (type.equals(java.util.Date.class)) {
						try {
							DateFormat formatter = null;
							// 处理只有年月日的格式：转换为“yyyy-MM-dd”格式的Date对象
							if (length <= 10) {
								formatter = new SimpleDateFormat(DATE, new DateFormatSymbols(Locale.CHINA));
								return (T) formatter.parse(dateValue);
							}
							// 处理只有年月日时分秒的格式：转换为“yyyy-MM-dd HH:mm:ss”格式的Date对象
							if (length <= 19) {
								formatter = new SimpleDateFormat(DATETIME, new DateFormatSymbols(Locale.CHINA));
								return (T) formatter.parse(dateValue);
							}
							// 处理只有年月日时分秒三位毫秒的格式：转换为“yyyy-MM-dd
							// HH:mm:ss.SSS”格式的Date对象
							if (length <= 23) {
								formatter = new SimpleDateFormat(TIMESTAMP, new DateFormatSymbols(Locale.CHINA));
								return (T) formatter.parse(dateValue);
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
				return (T) value;
			}
		}, Date.class);
		// 返回值
		T bean = null;
		try {
			// 创建bean的实力对象
			bean = clazzB.newInstance();
			// 获取所有的表单字段的name属性值
			Enumeration<String> paraNames = req.getParameterNames();
			// 遍历每一个表单控件的name属性值
			String pName;
			String pValue;
			while (paraNames.hasMoreElements()) {
				// 取出当前的name属性值
				pName = paraNames.nextElement();
				// 取出当前name属性对象的控件的value属性值
				pValue = req.getParameter(pName);
				/*
				 * 约定：表单控件的name属性值和映射的实体bean的属性字段名一一对应；
				 */
				BeanUtils.setProperty(bean, pName, pValue);
			}
		} catch (Exception e) {
			// request参数转换为实体bean异常
			MyUtil.logRootLogger.info("request参数转换为实体bean异常：" + e.getMessage());
		}
		return bean;
	}
}
